﻿using System.Collections.Generic;
using System.Drawing;
using AiFrame.InterfaceLib.Data.Patterns;
using AiFrame.InterfaceLib.Windows.Controls;

namespace AiFrame.Windows.Controls.DataNavigationBar.MVP
{
    class DataNavigationBarPresenter
    {
        private IDataNavigationBar _view;
        private IDataNavigationBarTheme _theme;
        private IObservableList<FrameDataNavigationBarButton> _buttonCollec;
        /*Abstand eines Buttons zum linken Rand */
        private int _leftDiff = 0;
        /* Horizontaler Abstand zum rechten Rand */
        private int _rightDiff = 0;


        public DataNavigationBarPresenter(IDataNavigationBar navigationBar, IDataNavigationBarTheme theme)
        {
            _view = navigationBar;
            _theme = theme;
            _buttonCollec = new ObservableList<FrameDataNavigationBarButton>();
            _buttonCollec.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(_buttonCollec_CollectionChanged);
        }

        void _buttonCollec_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            /* Initialisierungsabstand zum oberen Rand */
            int topPos = 0;
            /* Vertikaler Abstand der Buttons untereinander */
            int buttonDiff = 0;

            foreach (FrameDataNavigationBarButton button in _buttonCollec)
            {
                /* Den Button auf das Control positionieren */
                button.Parent = _view.GetButtonContainer();
                button.Left = _leftDiff;
                button.Top = topPos;

                /* Neue Top-Position für den nächsten Button setzen */
                topPos += buttonDiff + button.Height;
            }
        }

        /// <summary>
        /// Wird aufgerufen, wenn in der View ein Button hinzugefügt
        /// werden soll.
        /// </summary>
        /// <param name="name"></param>
        /// <param name="caption"></param>
        /// <param name="normalImage"></param>
        /// <param name="hoveredImage"></param>
        /// <param name="proc"></param>
        public void OnAddButton(string name, string caption, 
                Image normalImage, Image hoveredImage, OnDataNavBarClickProcedure proc)
        {
           FrameDataNavigationBarButton button = new FrameDataNavigationBarButton(
               name, caption, normalImage, hoveredImage, proc, _theme);

            _buttonCollec.Add(button);
            button.Width = _view.Width - _leftDiff - _rightDiff;

            _buttonCollec.Sort(new NavigationBarButtonComparer());
        }

        /// <summary>
        /// Wird aufgerufen, wenn in der View ein Button hinzugefügt werden soll.
        /// </summary>
        /// <param name="name"></param>
        /// <param name="caption"></param>
        /// <param name="normalImage"></param>
        /// <param name="hoveredImage"></param>
        /// <param name="saveObject"></param>
        public void OnAddButton(string name, string caption,
                Image normalImage, Image hoveredImage, OnDataNavBarClickProcedure proc, object saveObject, int positionIndex)
        {
            FrameDataNavigationBarButton button = new FrameDataNavigationBarButton(
                name, caption, normalImage, hoveredImage, proc, _theme, saveObject, positionIndex);

            _buttonCollec.Add(button);
            button.Width = _view.Width - _leftDiff - _rightDiff;
            _buttonCollec.Sort(new NavigationBarButtonComparer());
        }

        /// <summary>
        /// Wird aufgerufen, wenn sich die Größe der NavBar geändert hat.
        /// </summary>
        public void OnSizeChanged()
        {
            foreach (FrameDataNavigationBarButton button in _buttonCollec)
            {
                button.Width = _view.Width - _rightDiff - _leftDiff;
            }
        }

        public void RemoveAllButtons()
        {
            do
            {
                _buttonCollec[0].Dispose();
                _buttonCollec.RemoveAt(0);
            } while (_buttonCollec.Count > 0);
        }
    }

    public class NavigationBarButtonComparer: IComparer<FrameDataNavigationBarButton>
    {
        #region Implementation of IComparer<FrameDataNavigationBarButton>

        public int Compare(FrameDataNavigationBarButton x, FrameDataNavigationBarButton y)
        {
            if (x.PositionIndex < y.PositionIndex)
                return -1;

            if (x.PositionIndex > y.PositionIndex)
                return 1;

            return 0;
        }

        #endregion
    }
}
